package com.leo.interview.singleton;

/**
 * 双重检查锁写法
 *
 * getInstance()方法中，进行两次null检查。看似多此一举，但实际上却极大提升了并发度，进而提升了性能。为什么可以提高并发度呢？在单例中new的情况非常少，绝大多数都是可以并行的读操作。因此在加锁前多进行一次null检查就可以减少绝大多数的加锁操作，执行效率提高的目的也就达到了。
 *
 * 注意volatile的语义：可见性和禁止指令重排。可见性是jdk一直支持的，禁止指令重拍在jdk1.5之后才开始支持，所以此方法在jdk1.5以上才可运行。
 *
 * @author xuexiaolei
 * @version 2017年11月15日
 */
public class Singleton03 {
    private static volatile Singleton03 instance = null;
    private Singleton03(){}
    public static Singleton03 getInstance(){
        if(instance == null){
            synchronized (Singleton03.class){
                if (instance == null){
                    instance = new Singleton03();
                }
            }
        }
        return instance;
    }
}
